home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Forever 4
/
Atari Forever 4.zip
/
Atari Forever 4.iso
/
PD_THEMA
/
BIORHYTM
/
BIORHYTH.PD
/
BIORHYTH.PAS
next >
Wrap
Pascal/Delphi Source File
|
1998-03-14
|
30KB
|
849 lines
program biorhythmus; {(c) 1987/88 mkb }
{ ----------------- Systemunabhängige Variablen/Konstanten ------------------ }
type byte = 0..255; { nur nötig, wenn nicht implementiert }
dat = record
jahr : integer;
monat : byte;
tag : byte;
schalt : boolean;
system : byte;
end;
sht = string;
const stichjahr = 1582;
stichmonat = 10;
stichtag_jul = 4;
stichtag_greg = 15;
koerper = 0.27318197; { hier evtl. genauere Werte (je nach }
seele = 0.224399475; { System) einsetzen, diese zieml. genau }
geist = 0.190399555; { }
null = 55;
imp_version = '4.mG'; { Version 4.09 auf Mot. 68000 in Deutsch }
var monatsl : array [1..12] of byte;
verg : array [1..12] of integer;
wert2 : array [0..7] of integer;
monatsn : array [1..12] of string[10];
wert : array [1..3,1..12,1..31] of byte;
druckstr : array [1..7] of string[8];
geb_datum : dat;
akt_datum : dat;
testdat : dat;
print : string [80];
print1 : string [8];
print2 : string [8];
print3 : string [8];
beenden : boolean;
testdiff : real;
i,u,w : integer;
{ ------------- Systemabhängige Variablen : hier f. ATARI ST ---------------- }
handle_gem : integer;
work_gem : array [0..56] of integer;
{ ---------------- Systemabhängiger Teil : hier f. ATARI ST ----------------- }
procedure curs_on;
var i : integer;
begin
i:=cursconf(1,0);
i:=cursconf(4,20);
i:=kbrate(14,2);
end;
procedure curs_off;
var i : integer;
begin
i:=cursconf(0,0);
i:=kbrate(8,3);
end;
procedure hireson;
begin
curs_off; { Mindestgrafikauflösung : }
for i:=0 to 9 do work_gem[i]:=1; { }
work_gem[10]:=2; { }
v_opnvwk(work_gem,handle_gem,work_gem); { }
work_gem[0]:=vswr_mode(handle_gem,3); { 640 * 200 Punkte HIRES }
work_gem[0]:=vsl_type(handle_gem,1);
work_gem[0]:=vsl_width(handle_gem,1); { Hier eine bel. HIRES- }
vsl_ends(handle_gem,0,0); { Grafikauflösung einschal-}
hidemouse; { ten. }
end;
procedure hiresoff;
begin
v_clsvwk(handle_gem);
curs_on;
end;
procedure clrhires;
begin
clrscr;
end;
procedure plot(x,y : integer);
begin
work_gem[0]:=x; { Umrechnungen : }
work_gem[1]:=400-2*y; { }
work_gem[2]:=x; { X_koor = (X_Aufl/640)*x }
work_gem[3]:=400-2*y; { Y_koor = Y_Aufl-(Y_Aufl/200)*y }
v_pline(handle_gem,2,work_gem); { [Nullpunkt : unten links !] }
end; { X_Aufl : Die eigene x-Aufl. }
{ Y_Aufl : Die eigene y-AUfl. }
procedure line(x1,y1,x2,y2 : integer);
begin
work_gem[0]:=x1;
work_gem[1]:=400-2*y1;
work_gem[2]:=x2;
work_gem[3]:=400-2*y2;
v_pline(handle_gem,2,work_gem);
end;
procedure printat(x,y : integer;print : sht);
begin
gotoxy(x,y-1);write(print); { Umrechnungen : }
end; { }
{ Bildschirm hat 2000 }
procedure writesmall(x,y : integer;print : sht); { Zeichen : 80*25 }
var i:integer; { Nullpunkt [0;0] : }
begin { links oben }
for i:=0 to length(print)-1 do { Werteber. : x) 0..79 }
put_char(print[i+1],x*8+i*8,(y*16)-4,0); { y) 0..24 }
end; { [von y evtl. 1 ab- }
{ ziehen] }
procedure hardcopy; { Zeichenmatrix : 8*8 }
begin
scrdmp; { eigene Routine oder }
end; { Systemroutine }
procedure druckeranpassung;
begin
druckstr[1]:='..'; ; { Für jedes Steuerbefehlzeichen ein Punkt }
druckstr[1][1]:=chr(13) ; { chr(0) zählt nicht mitrechnen ! }
druckstr[1][2]:=chr(10) ;
druckstr[1][3]:=chr(00) ; { Zeilenvorschub }
druckstr[2]:='.';
druckstr[2][1]:=chr(12) ;
druckstr[2][2]:=chr(00) ; { Seitenauswurf }
druckstr[3]:='..';
druckstr[3][1]:=chr(27) ;
druckstr[3][2]:=chr(69) ;
druckstr[3][3]:=chr(00) ; { Fettdruck Anf./evtl. dopp. Anschlag }
druckstr[4]:='..';
druckstr[4][1]:=chr(27) ;
druckstr[4][2]:=chr(70) ;
druckstr[4][3]:=chr(00) ; { Fettdruck Ende/evtl. dopp. Anschlag }
druckstr[5]:='...';
druckstr[5][1]:=chr(27) ;
druckstr[5][2]:=chr(87) ;
druckstr[5][3]:=chr(49) ;
druckstr[5][4]:=chr(00) ; { Hervorhebung Anfang - hier dopp. B.}
druckstr[6]:='...';
druckstr[6][1]:=chr(27) ;
druckstr[6][2]:=chr(87) ;
druckstr[6][3]:=chr(48) ;
druckstr[6][4]:=chr(00) ; { Hervorhebung Ende - evtl. Kursiv }
{ statt Fettdruck : doppelter Anschlag/NLQ }
{ statt doppelter Breite : Invertdruck - chr(18) bei mps80x-kompatiblen }
end;
{ -------------------- ab hier computerunabhängiger Teil ---------------------}
procedure initarrays;
begin
wert2[1]:=1 ;wert2[2]:=2 ;wert2[3]:=4 ;wert2[4]:=8;wert2[5]:=16;
wert2[6]:=32;wert2[7]:=64;wert2[8]:=128;
monatsl[1]:=31;monatsl[2]:=29 ;monatsl[3]:=31 ;monatsl[4]:=30;
monatsl[5]:=31;monatsl[6]:=30 ;monatsl[7]:=31 ;monatsl[8]:=31;
monatsl[9]:=30;monatsl[10]:=31;monatsl[11]:=30;monatsl[12]:=31;
verg[1]:=0 ;verg[2]:=31 ;verg[3]:=59 ;verg[4]:=90 ;verg[5]:=120 ;
verg[6]:=151 ;verg[7]:=182 ;verg[8]:=213;verg[9]:=243;verg[10]:=273;
verg[11]:=304;verg[12]:=334;
monatsn[1]:='Januar' ;monatsn[2]:='Februar' ;monatsn[3]:='März';
monatsn[4]:='April' ;monatsn[5]:='Mai' ;monatsn[6]:='Juni';
monatsn[7]:='Juli' ;monatsn[8]:='August' ;monatsn[9]:='September';
monatsn[10]:='Oktober';monatsn[11]:='November';monatsn[12]:='Dezember';
end;
function julianisch (datum : dat) : real;
begin
julianisch:=(datum.jahr-1)*365+verg[datum.Monat]+((datum.jahr-1) div 4)+
datum.tag;
end;
function gregorianisch (datum : dat) : real;
begin
gregorianisch:=(datum.jahr-1)*365+verg[datum.monat]+((datum.jahr-1)
div 4)-((datum.jahr-1) div 100) + ((datum.jahr-1) div 400)
+ datum.tag;
end;
procedure zeitdifferenz (var diff : real;geb_datum : dat;akt_datum : dat);
var diff_1 : real;
diff_2 : real;
dummy : dat;
procedure korrektur (datum : dat;var diff : real);
begin
if (datum.schalt=true) and (datum.monat>=3) then diff:=diff+1;
end;
begin
if (geb_datum.system)=(akt_datum.system) then begin
if (geb_datum.system)=1 then begin
diff_1:=julianisch(geb_datum);
diff_2:=julianisch(akt_datum);
end;
if (geb_datum.system)=2 then begin
diff_1:=gregorianisch(geb_datum);
diff_2:=gregorianisch(akt_datum);
end;
korrektur(geb_datum,diff_1);
korrektur(akt_datum,diff_2);
diff:=diff_2-diff_1;
end
else begin
dummy.jahr:=stichjahr;
dummy.monat:=stichmonat;
dummy.tag:=stichtag_jul;
diff_1:=julianisch(geb_datum);
diff_2:=julianisch(dummy);
korrektur(geb_datum,diff_1);
diff:=diff_2-diff_1;
dummy.tag:=stichtag_greg;
diff_1:=gregorianisch(dummy);
diff_2:=gregorianisch(akt_datum);
korrektur(akt_datum,diff_2);
diff:=diff+(diff_2-diff_1)+1;
end;
end;
function wochentag (datum : dat) : integer ;
var j,c,t,m : real;
begin
c:=datum.jahr div 100;
j:=datum.jahr-c*100;
if datum.monat<3 then begin
datum.monat:=datum.monat+12;
j:=j-1;
if j<0 then begin
j:=99;
c:=c-1;
end;
end;
m:=datum.monat;
t:=datum.tag;
case datum.system of
1 : t:=t+int((m+1)*26/10)+j+int(j/4)+5-c;
2 : t:=t+int((m+1)*26/10)+j+int(j/4)+int(c/4)-2*c;
end;
t:=t-7*int(t/7);
repeat
if t>6 then t:=t-7;
until t<=7;
wochentag:=round(t);
end;
procedure drucke (x,y : integer;datum : dat);
var print1 : string[5];
print2 : string[5];
print3 : string[5];
print : string[20];
i : integer;
begin
str(datum.tag,print1);
str(datum.monat,print2);
str(datum.jahr,print3);
print:=print1+'.'+print2+'.'+print3;
if length(print)<10 then for i:=length(print) to 10 do print:=print+' ';
if (datum.jahr=stichjahr) then if (datum.monat=stichmonat) then if
(datum.tag>stichtag_jul) and (datum.tag<stichtag_greg) then
datum.system:=3;
i:=wochentag(datum);
if datum.system<3 then begin
case i of
0 : print:='Sa,'+print;
1 : print:='So,'+print;
2 : print:='Mo,'+print;
3 : print:='Di,'+print;
4 : print:='Mi,'+print;
5 : print:='Do,'+print;
6 : print:='Fr,'+print;
end;
end
else print:='--,'+'--.--.----';
printat(x,y,print);
end;
procedure ermittle_werte;
var i : byte;
tag : byte;
dummy : real;
dummy2 : dat;
procedure sonderfall;
var z,m : integer;
begin
if akt_datum.jahr=stichjahr then if i=stichmonat then if
tag=stichtag_greg-1 then begin
for z:=stichtag_jul+1 to stichtag_greg-1 do
for m:=1 to 3 do
wert[m,i,z]:=200;
akt_datum.system:=2;
dummy:=dummy-10;
dummy2.system:=2;
end;
if akt_datum.schalt=false then if i=2 then if tag=29 then begin
wert[1,2,29]:=200;
wert[2,2,29]:=200;
wert[3,2,29]:=200;
dummy:=dummy-1;
end;
if dummy<0 then begin
for z:=1 to 3 do
wert[z,i,tag]:=200;
end;
end;
begin
dummy:=0;
if akt_datum.jahr=stichjahr then akt_datum.system:=1;
dummy2:=akt_datum;
dummy2.monat:=1;
dummy2.tag:=1;
zeitdifferenz(dummy,geb_datum,dummy2);
if (geb_datum.system=2) and (akt_datum.jahr=stichjahr) then
dummy:=dummy+20;
for i:=1 to 12 do begin
print:='** Ermittle '+monatsn[i]+'. Bitte Warten. ** ';
printat(23,16,print);
for tag:=1 to monatsl[i] do begin
wert[1,i,tag]:=round(sin(koerper*dummy)*50+null);
wert[2,i,tag]:=round(sin(seele*dummy)*50+null);
wert[3,i,tag]:=round(sin(geist*dummy)*50+null);
if (akt_datum.jahr=stichjahr) or (akt_datum.schalt=false) or (dummy<0)
then sonderfall;
dummy:=dummy+1;
end;
end;
end;
procedure box (x1,y1,x2,y2 : integer);
procedure zeichne;
begin
line(x1,y1,x2,y1);
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
line(x1,y2,x1,y1);
end;
procedure zeichne2;
begin
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
end;
begin
x1:=x1+3;y1:=y1-1;x2:=x2+3;y2:=y2-1;
zeichne2;
x1:=x1-3;y1:=y1+1;x2:=x2-3;y2:=y2+1;
zeichne;
end;
procedure bildschirmaufbau;
begin
hireson;
clrhires;
box(2,199,635,110);
box(2,107,635,3);
box(300,185,610,118);
box(17,146,160,118);
box(180,146,250,118);
line(190,140,240,140);
line(190,132,200,132);line(210,132,220,132);line(230,132,240,132);
plot(190,124);plot(200,124);plot(210,124);plot(220,124);plot(230,124);
plot(240,124);
box(17,185,147,165);
box(160,185,290,165);
printat(39,3,'Biorhythmus '+imp_version+':(c) Matthias Berger');
printat(39,4,'------------------------------------');
printat(39,6,'Wertebereich : -50 -> 50');
printat(39,8,'A/D : Tag Y/C : Monat (-/+)');
printat(39,9,' J : Datum L : Drucke');
printat(39,10,' H : Copy S : Deuten E : Ende');
printat(4,8,'Körper :');
printat(4,9,'Seele :');
printat(4,10,'Geist :');
printat(4,3,'Geb. Datum:');
printat(22,3,'Akt. Datum:');
line(42,null,598,null);
line(42,null-1,598,null-1);
line(40,null+50,40,null-50);
line(41,null+50,41,null-50);
for i:=1 to 5 do begin
line(35,null+i*10,45,null+i*10);
line(35,null-i*10,45,null-i*10);
end;
for i:=1 to 31 do begin
line(40+i*18,null+2,40+i*18,null-2);
line(41+i*18,null+2,41+i*18,null-2);
end;
writesmall(1,round((200-null-10)/8),'+10'); { Aufgrund der groben }
writesmall(1,round((200-null+10)/8)+1,'-10'); { Rundung ist ein Be- }
writesmall(1,round((200-null-20)/8),'+20'); { schriftung per FOR- }
writesmall(1,round((200-null+20)/8),'-20'); { DO-Schleife nicht zu }
writesmall(1,round((200-null-30)/8)+1,'+30'); { empfehlen ! }
writesmall(1,round((200-null+30)/8),'-30');
writesmall(1,round((200-null-40)/8)+1,'+40'); { Die x/y-Koordinaten }
writesmall(1,round((200-null+40)/8),'-40'); { müssen die gleichen }
writesmall(1,round((200-null-50)/8)+1,'+50'); { Dimensionen haben }
writesmall(1,round((200-null+50)/8),'-50'); { wie die x/y-Koordi- }
writesmall(15,round((200-null)/8)+1,'5'); { naten der 'printat'- }
writesmall(26,round((200-null)/8)+1,'10'); { Routine ! }
writesmall(37,round((200-null)/8)+1,'15');
writesmall(48,round((200-null)/8)+1,'20');
writesmall(59,round((200-null)/8)+1,'25');
writesmall(71,round((200-null)/8)+1,'30');
end;
function schaltjahr (jahr : integer) : boolean;
var richtig : boolean;
begin
richtig:=false;
if jahr<stichjahr then begin
if jahr mod 4 = 0 then richtig:=true;
end
else begin
if (jahr mod 4 = 0) then richtig:=true;
if (jahr mod 100=0) and (jahr mod 400<>0) then richtig:=false;
end;
schaltjahr:=richtig;
end;
procedure datumseingabe;
procedure datumseing2 (var datum : dat);
var richtig:boolean;
begin
repeat
repeat
write(' Jahr (>0000): ');readln(datum.jahr);
until datum.Jahr>0;
datum.schalt:=schaltjahr(datum.jahr);
repeat
write(' Monat: ');readln(datum.monat);
until (datum.monat<=12);
repeat
write(' Tag (<=',monatsl[datum.monat],'): ');readln(datum.tag);
until (datum.tag<=monatsl[datum.monat]);
richtig:=true;
if (datum.monat=2) and (not datum.schalt) and
(datum.tag=29) then datum.tag:=datum.tag-1;
if julianisch(datum)<=testdiff then datum.system:=1
else datum.system:=2;
if (datum.jahr=stichjahr) and (datum.monat=stichmonat) and
(datum.tag>stichtag_jul) and (datum.tag<stichtag_greg) then begin
writeln;
writeln(' ! Dieses Datum hat nie exisiert, es wurde bei der ! ');
write(' ! Kalenderumstellung anno ',stichjahr,' ausgelassen. ');
writeln(' !');
writeln(' ! Bitte neuen Tag eingeben ! ');
writeln;
richtig:=false;
end;
until richtig;
end;
begin
hireson;
clrhires;
hiresoff;
clrscr;
writeln('Biorhythmusberechnung V ',imp_version,' - DATUMSEINGABE');
writeln('---------------------------------------------');
writeln;writeln;
writeln('Bitte geben Sie zuerst das Geburtsdatum der Person ein,');
writeln('deren Biorhythmus ermittelt werden soll.:');
writeln;
datumseing2(geb_datum);
writeln;
writeln('Geben Sie nun das Datum ein, daß Sie erläutert haben wollen.:');
writeln;
datumseing2(akt_datum);
bildschirmaufbau;
ermittle_werte;
drucke(4,4,geb_datum);
printat(23,16,' ');
end;
procedure deute(akt_datum: dat;single : boolean);
var i,u : integer;
x : real;
begin
for i:=1 to 40 do write(lst,'.');writeln(lst,druckstr[1],druckstr[3]);
write(lst,'Sie haben am ',druckstr[5]);
case wochentag(akt_datum) of
0 : write(lst,'Sa');
1 : write(lst,'So');
2 : write(lst,'Mo');
3 : write(lst,'Di');
4 : write(lst,'Mi');
5 : write(lst,'Do');
6 : write(lst,'Fr');
end;
writeln(lst,druckstr[6],
', den ',akt_datum.tag,'.',akt_datum.monat,'.',akt_datum.jahr);
for i:=1 to 3 do
begin
if wert[i,akt_datum.monat,akt_datum.tag]<200 then write(lst,' eine ');
u:=-5;
repeat
if (int((wert[i,akt_datum.monat,akt_datum.tag]-null)/10) = u) then
case u of
-5 : write(lst,' besch[eidene] ');
-4 : write(lst,' schlechte ');
-3 : write(lst,' ungute ');
-2 : write(lst,' mässige ');
-1 : write(lst,' abgeschlaffte ');
0 : write(lst,' gefährliche ');
1 : write(lst,' ziemlich günstige ');
2 : write(lst,' annehmbare ');
3 : write(lst,' gute ');
4 : write(lst,' optimale ');
5 : write(lst,' ausgezeichnete ');
end;
u:=u+1;
until (int((wert[i,akt_datum.monat,akt_datum.tag]-null)/ 10) = (u-1))
or (wert[i,akt_datum.monat,akt_datum.tag]=200);
if (wert[i,akt_datum.monat,akt_datum.tag]=200) then begin
if i=1 then
writeln(lst,' gar nicht gelebt.');
end
else begin
case i of
1 : writeln(lst,' Kondition ');
2 : writeln(lst,' Seelenlage ');
3 : writeln(lst,' Geisteskraft. ');
end;
end;
end;
if int((wert[1,akt_datum.monat,akt_datum.tag]-null)/10) =
int((wert[2,akt_datum.monat,akt_datum.tag]-null)/10) then
if wert[2,akt_datum.monat,akt_datum.tag]-null>0 then
write(lst,druckstr[1],'Guter Tag für alle Angelegenheiten ! ')
else if wert[2,akt_datum.monat,akt_datum.tag]-null<0 then
write(lst,druckstr[1],'Schlechter Tag für alle Angelegenheiten ! ');
if ((wert[1,akt_datum.monat,akt_datum.tag]-null) div 10) = 0 then
if ((wert[2,akt_datum.monat,akt_datum.tag]-null) div 10) = 0 then
if ((wert[3,akt_datum.monat,akt_datum.tag]-null) div 10) = 0 then
if (akt_datum.jahr)<>(geb_datum.jahr) then begin
writeln(lst,druckstr[1]
,' GEFAHR ! DREI NULLDURCHGÄNGE ! GEFAHR !');
writeln(lst,' ACHTUNG VOR UNFÄLLEN/KRANKHEITEN/TOD ! ');
end;
if single then begin
write(lst,druckstr[1]);
if wert[1,akt_datum.monat,akt_datum.tag]<200 then begin
write(lst,'Das ist ihr ');
zeitdifferenz(x,geb_datum,akt_datum);
i:=round(x)+1;
writeln(lst,i,'. Lebenstag.');
end;
write(lst,druckstr[1],'Gültig für Geb.-Datum : ');
case wochentag(geb_datum) of
0 : write(lst,'Sa');
1 : write(lst,'So');
2 : write(lst,'Mo');
3 : write(lst,'Di');
4 : write(lst,'Mi');
5 : write(lst,'Do');
6 : write(lst,'Fr');
end;
writeln(lst,',',geb_datum.tag,'.',geb_datum.monat,'.',
geb_datum.jahr,'.',druckstr[1],' -mkb 88');
end;
write(lst,druckstr[4]);for i:=1 to 40 do write(lst,'.');writeln(lst);
end;
procedure druckerausgabe;
var y,i,u,bte : integer;
x : real;
m : char;
dummy : dat;
procedure plusminus(x : integer);
var i : integer;
c : char;
begin
x:=x-null;
if x<=50 then begin
if x<10 then if x>-10 then
print:=' '+druckstr[3]+' CAUTIONDAY '+druckstr[4];
if x>=10 then begin
print:=' ';
for i:=1 to (x div 10) do
print:=print+'+';
end
else if x<-10 then begin
print:='';
for i:=1 to ((x*-1) div 10) do
print:=print+'-';
end;
end
else print:=' (nicht gelebt)';
end;
begin
curs_on;
printat(39,5,'Druckerausgabe mit Deutung (J/N) :');
read(kbd,m);m:=upcase(m);
printat(39,5,' ');
curs_off;
dummy:=akt_datum;
dummy.tag:=1;
writeln(lst,druckstr[2]);writeln(lst);
writeln(lst,'Biorhythmuswerte');
writeln(lst,'----------------');
writeln(lst);writeln(lst);
writeln(lst,'Für:');
write(lst,'Geb. am : ');
case wochentag(geb_datum) of
0 : write(lst,'Sa');
1 : write(lst,'So');
2 : write(lst,'Mo');
3 : write(lst,'Di');
4 : write(lst,'Mi');
5 : write(lst,'Do');
6 : write(lst,'Fr');
end;
write(lst,', ',geb_datum.tag,'. ',monatsn[geb_datum.monat]);
writeln(lst,' ',geb_datum.jahr);
write(lst,'Geltungsmonat: ',monatsn[akt_datum.monat]);
writeln(lst,' ',akt_datum.jahr);
write(lst,'Der Monat enthält den ');
zeitdifferenz(x,geb_datum,dummy); i:=round(x)+1;
write(lst,i,'. - ');
dummy.tag:=monatsl[akt_datum.monat];
if (akt_datum.monat=2) and (not akt_datum.schalt) then
dummy.tag:=28;
zeitdifferenz(x,geb_datum,dummy); i:=round(x)+1;
writeln(lst,i,'. Lebenstag. ');
writeln(lst);writeln(lst);
u:=monatsl[akt_datum.monat];
if (u=28) and (schaltjahr(akt_datum.jahr)) then u:=29;
for i:=1 to u do begin
if m='N' then begin
writeln(lst);writeln(lst,druckstr[3],
druckstr[5],' ',i,' ',druckstr[6],druckstr[4]);
for w:= 1 to 3 do begin
case w of
1 : write(lst,'Körper: ');
2 : write(lst,'Seele : ');
3 : write(lst,'Geist : ');
end;
write(lst,wert[w,akt_datum.monat,i]-null);
plusminus(wert[w,akt_datum.monat,i]);
writeln(lst,' ',print);
end;
if wert[1,akt_datum.monat,akt_datum.tag] div 10 =
wert[2,akt_datum.monat,akt_datum.tag] div 10 then
if wert[2,akt_datum.monat,akt_datum.tag]-null>0 then
write(lst,druckstr[1],'Guter Tag für alle Angelegenheiten ! ')
else if wert[2,akt_datum.monat,akt_datum.tag]-null<0 then
write(lst,druckstr[1],
'Schlechter Tag für alle Angelegenheiten ! ');
end else begin
dummy.tag:=i;
deute(dummy,false);
end;
end;
writeln(lst);writeln(lst);writeln(lst,'Biorhythmus erstellt auf einem ');
write(lst,'atari st/[c 128]/[s-pc/d];');
writeln(lst,'(C) 1987 Matthias Berger/(c) 88 mkb [rewritten]');
writeln(lst);writeln(lst,druckstr[2]);
end;
procedure hauptprogramm;
var i : integer;
wahl : char;
monat : boolean;
jahr : boolean;
procedure zeichne(datum : dat); { Diese Procedure zeichnet alleine }
var i : integer; { die Rhythmenkurven anhand der }
u : byte; { Werte in drei Linienarten (Sys- }
z : boolean; { temunabhängig !) }
l : dat;
begin
z:=false;
for i:=1 to monatsl[datum.monat]-1 do begin
z:=not z;
for u:=1 to 3 do begin
if ((u=1) or ((u=2) and (z=true))) and (wert[u,datum.monat,i]<200)
and (wert[u,datum.monat,i+1]<200) then
line(49+(18*(i-1)),wert[u,datum.monat,i],
49+(18*i)-1,wert[u,datum.monat,i+1]);
if (u=3) and (wert[u,datum.monat,i]<200) and
(wert[u,datum.monat,i+1]<200) then begin
line(49+(18*(i-1)),wert[u,datum.monat,i],49+(18*(i-1))-1,
wert[u,datum.monat,i]-1);
if i=monatsl[datum.monat]-1 then
line(49+(18*i),wert[u,datum.monat,i+1],49+(18*(i))-1,
wert[u,datum.monat,i+1]);
end;
end;
end;
l:=akt_datum;l.tag:=1;
if ((l.jahr=stichjahr) and (l.monat<>stichmonat))
or (l.jahr<>stichjahr) then
begin
repeat
if wochentag(l)=1 then begin
for i:=0 to 4 do
line(47+i+(18*(l.tag-1)),null+4,47+i+(18*(l.tag-1)),null-4);
l.tag:=l.tag+7;
end
else l.tag:=l.tag+1;
until l.tag>monatsl[l.monat];
end;
end;
procedure linie (datum : dat);
begin
line(49+((datum.tag-1)*18),null+50,49+((datum.tag-1)*18),null-50);
end;
begin
testdat.jahr:=stichjahr;testdat.tag:=stichtag_jul;testdat.monat:=stichmonat;
testdat.system:=1;testdat.schalt:=false;
testdiff:=julianisch(testdat);
beenden:=false;
repeat
jahr:=false;
datumseingabe;
repeat
monat:=false;
zeichne(akt_datum);
repeat
drucke(22,4,akt_datum);
linie(akt_datum);
for i:=1 to 3 do begin
str(wert[i,akt_datum.monat,akt_datum.tag]-null,print);
if length(print)<3 then for u:=1 to 3-length(print) do
print:=print+' ';
if wert[i,akt_datum.monat,akt_datum.tag]=200 then print:='---';
printat(16,7+i,print);
end;
repeat
read(kbd,wahl);
until wahl in ['a','A','d','D','y','Y','c','C','j','J','l','L',
'e','E','h','H','s','S'];
linie(akt_datum);
case wahl of
'a','A' : begin
akt_datum.tag:=akt_datum.tag-1;
if akt_datum.tag<1 then begin
monat:=true;
zeichne(akt_datum);
akt_datum.tag:=monatsl[akt_datum.monat-1];
if (akt_datum.monat=3) and (not akt_datum.schalt)
then akt_datum.tag:=28;
if akt_datum.monat-1<1 then jahr:=true;
akt_datum.monat:=akt_datum.monat-1;
end;
end;
'd','D' : begin
akt_datum.tag:=akt_datum.tag+1;
if (akt_datum.tag>monatsl[akt_datum.monat])
or ((akt_datum.monat=2) and (not akt_datum.schalt)
and (akt_datum.tag=29)) then begin
monat:=true;
zeichne(akt_datum);
akt_datum.tag:=1;
if akt_datum.monat+1>12 then jahr:=true;
akt_datum.monat:=akt_datum.monat+1;
end;
end;
'e','E' : begin
hiresoff;
beenden:=true;
end;
'y','Y' : begin
monat:=true;
zeichne(akt_datum);
akt_datum.monat:=akt_datum.monat-1;
if akt_datum.monat<1 then jahr:=true;
end;
'c','C' : begin
monat:=true;
zeichne(akt_datum);
akt_datum.monat:=akt_datum.monat+1;
if akt_datum.monat>12 then jahr:=true;
end;
'j','J' : begin
jahr:=true;
monat:=true;
end;
'l','L' : druckerausgabe;
'h','H' : begin
linie(akt_datum);
hardcopy;
linie(akt_datum);
end;
's','S' : deute(akt_datum,true);
end;
if julianisch(akt_datum)<=testdiff then akt_datum.system:=1 else
akt_datum.system:=2;
until (monat) or (beenden);
until (jahr) or (beenden);
hiresoff
until (geb_datum.jahr<0) or (beenden);
end;
begin
initarrays;
druckeranpassung;
hauptprogramm;
clrscr;writeln('(c) mkb rewritten dec. 88 on atari from c128');
end.
{ Es wurden im systemunabhängigen Teil nur übliche impl. Proceduren/Functionen}
{ verwendet. Läßt sich eine, nicht elementar wichtige, systemabhängige, }
{ Procedure/Function keine Implementation finden, so läßt man den Anweisungs- }
{ teil dieser Procedure/Function leer. }
{ Das Programm läuft auf System impl. Version für Drucker }
{ --------------------------------------------------------------------------- }
{ }
{ - CPM+/C128d 3.z[80]G sl80ai/ipd560 }
{ - MS-dos/Siemens PC-d 3.i[86]G ibm-comp. }
{ - ATARI ST 4.m[86]G sl80ai[ibm/fx80] }
{ }
{ Entwicklungssystem war ein C128d mit 80-Zeichen-Monochrom-Monitor und }
{ SL80ai-Drucker unter CP/M+. Entwicklungssprache war TURBO-PASCAL. }
{ Die Sprache wurde anderen Versionen angepasst, die Grafik/Text-Vorgaben }
{ sind voll in den computerunabhängigen Teil übernommen worden, da sie einen }
{ Minimal-Standart darstellen. Bitte die Umrechnungsangaben im computersprez- }
{ ifischen Teil beachten. }